/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package praticav.dao;

import praticav.model.Fases;
import praticav.util.HibernateUtil;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import praticav.model.FasesPK;
import praticav.model.Producao;

/**
 * @author Katiane
 */
public class FasesDAO {
    public FasesDAO() {
  sessao = HibernateUtil.getsession();
  }
    
  private Session sessao;
  
  public void inserir(Fases c) {
    Transaction t = sessao.beginTransaction();
    //Busca o sequencial da producao
    //Atualiza o sequencial da producao
    Producao p = new ProducaoDAO().buscar(c.getChave().getProducao().getProcodigo());
    c.setFassequencial(p.getProsequencia());
    FasesPK chave = new FasesPK();
    chave = c.getChave();
    chave.setFascodigo(Integer.parseInt(""+getMaxID(c.getChave().getProducao().getProcodigo()))+1);
    c.setChave(chave);
    sessao.save(c);
    t.commit();
    //p = c.getProducao();
    p.setProsequencia(p.getProsequencia()+1);
    ProducaoDAO daoProd = new ProducaoDAO();
    daoProd.editar(p);
  }
  
  public void editar(Fases c) {
    Transaction t = sessao.beginTransaction();
    sessao.merge(c);
    t.commit();    
  }
  
  public void excluir(Fases c) {
    Transaction t = sessao.beginTransaction();
    sessao.delete(c);
    t.commit();
  }
  
  public Fases buscar(FasesPK chave){
    return (Fases) sessao.load(Fases.class, chave);
  }   
  
  public List<Fases> listar() {
    Query qu = sessao.createQuery("from Fases"); 
    return qu.list();
  }
  public List<Fases> listar(int ProCodigo, int FasCodigo, String FasDescricao, String DtaInicialInicial, String DtaInicialFinal, String DtaFinalInicial, String DtaFinalFinal) {
  String condicoes = "";
  Integer primeiro=0;
  
  if (ProCodigo > 0){
      if (primeiro == 0){//Se for a primeira vez, adiciona "where", senão, adiciona "and"
          condicoes += " where ";
          primeiro = 1;
      }
      else
          condicoes += " and ";
      
      condicoes += "ProCodigo = "+ProCodigo;
  }
  if (FasCodigo > 0){
      if (primeiro == 0){//Se for a primeira vez, adiciona "where", senão, adiciona "and"
          condicoes += " where ";
          primeiro = 1;
      }
      else
          condicoes += " and ";      
      condicoes += "FasCodigo = "+FasCodigo;  
  }
  if (FasDescricao.length() > 0){
      if (primeiro == 0){//Se for a primeira vez, adiciona "where", senão, adiciona "and"
          condicoes += " where ";
          primeiro = 1;
      }
      else
          condicoes += " and ";
      condicoes += "FasDescricao like %'"+FasDescricao+"'%";    
  }
  if (DtaInicialInicial.length() > 0){
      if (primeiro == 0){//Se for a primeira vez, adiciona "where", senão, adiciona "and"
          condicoes += " where ";
          primeiro = 1;
      }
      else
          condicoes += " and ";
      condicoes += "FasDtaInicial >= '"+DtaInicialInicial+"'";      
  }
  if (DtaInicialFinal.length() > 0){
      if (primeiro == 0){//Se for a primeira vez, adiciona "where", senão, adiciona "and"
          condicoes += " where ";
          primeiro = 1;
      }
      else
          condicoes += " and ";
      condicoes += "FasDtaInicial <= '"+DtaInicialFinal+"'";      
  }  
  if (DtaFinalInicial.length() > 0){
      if (primeiro == 0){//Se for a primeira vez, adiciona "where", senão, adiciona "and"
          condicoes += " where ";
          primeiro = 1;
      }
      else
          condicoes += " and ";
      condicoes += "FasDtaFinal >= '"+DtaFinalInicial+"'";      
  }
  if (DtaFinalFinal.length() > 0){
      if (primeiro == 0){//Se for a primeira vez, adiciona "where", senão, adiciona "and"
          condicoes += " where ";
          primeiro = 1;
      }
      else
          condicoes += " and ";
      condicoes += "FasDtaFinal <= '"+DtaFinalFinal+"'";      
  }  
    Query qu = sessao.createQuery("from Fases"+condicoes +" order by FasSequencial"); 
    return qu.list();
  }
  public List<Fases> listar(int ProCodigo, int FasPredecessor) {
    Query qu = sessao.createQuery("from Fases where ProCodigo = " +ProCodigo+" and FasPredecessor = "+FasPredecessor); 
    return qu.list();
  }
    private int getMaxID(int ProCodigo)  
    {  
        Object obj = sessao.createSQLQuery("SELECT MAX(FasCodigo) FROM Fases where ProCodigo = "+ProCodigo).uniqueResult();  
        if(obj==null)  
            return 0;  
        return Integer.parseInt( obj.toString());  
    } 
}
